<?php

namespace IYUU\sdk\CoolQ\Modules\system\Domain;

use BadRequestException;
use BannedWordsModel;
use IYUU\sdk\CoolQ\Context;
use IYUU\sdk\CoolQ\Domain\BannedWords as DomainBannedWords;
use IYUU\sdk\CoolQ\Event\Message as EventMessage;
use IYUU\sdk\CoolQ\ModulesDomainInterface;

/**
 * 违禁词管理
 * - 增、查、编辑、开关
 * Class BannedWords
 * @package IYUU\sdk\CoolQ\Modules\system\Domain
 */
class BannedWords implements ModulesDomainInterface
{
    /**
     * 命令分隔符
     */
    const SEP = '{##}';
    /**
     * @var array
     */
    private $data = [];

    /**
     * 插件状态
     * @return bool
     */
    public function state(): bool
    {
        return true;
    }

    /**
     * 菜单
     * @param string $message 消息内容
     * @return string
     */
    public function menu(string $message): string
    {
        if ($this->keyword() === $message) {
            $reply = '违禁词操作格式：' . PHP_EOL;
            $reply .= '增加：add{分隔符}匹配内容{分隔符}匹配模式' . PHP_EOL;
            $reply .= '编辑：update{分隔符}主键{分隔符}匹配内容{分隔符}匹配模式' . PHP_EOL;
            $reply .= '开关：status{分隔符}主键{分隔符}1' . PHP_EOL;
            $reply .= '查看：show{分隔符}主键' . PHP_EOL . PHP_EOL;
            $reply .= '匹配模式：1相等、2包含、3正则' . PHP_EOL;
            $reply .= '示例：add{分隔符}围巾{分隔符}1';
            return str_replace('{分隔符}', self::SEP, $reply);
        }

        return '';
    }

    /**
     * 触发的关键字
     * @return string
     */
    public function keyword(): string
    {
        return '违禁词';
    }

    /**
     * @param Context $context
     * @param EventMessage $msgObj
     * @return string
     * @throws BadRequestException
     */
    public function process(Context $context, EventMessage $msgObj): string
    {
        // 必须工作人员，才能进行的操作
        $msgObj->requireWorker(); ;
        $message = $context->get('message');
        if (empty($message)) {
            return '命令为空';
        }

        // 分隔命令
        if (false !== strpos($message, self::SEP)) {
            $this->data = explode(self::SEP, $message);
        } else {
            return '分隔符不正确';
        }

        // 路由
        switch (true) {
            case (strpos($message, 'add' . self::SEP) === 0):
                return $this->add();
            case (strpos($message, 'status' . self::SEP) === 0):
                return $this->status();
            case (strpos($message, 'update' . self::SEP) === 0):
                return $this->update();
            case (strpos($message, 'show' . self::SEP) === 0):
                return $this->show();
        }

        return '未匹配到命令路由';
    }

    /**
     * 增加
     * @return string
     */
    private function add(): string
    {
        /**
         * 验证格式
         */
        if (count($this->data) != 3) {
            return '格式不正确，数组不等于3';
        }
        $data = array_filter($this->data, function ($v, $k) {
            return $v !== '';
        }, ARRAY_FILTER_USE_BOTH);
        if (count($data) !== count($this->data)) {
            return '格式不正确，数组值不能为空';
        }

        // 匹配模式
        if (!is_numeric($this->data[2])) {
            return '匹配模式非数字：' . $this->data[2];
        }
        $content = $this->data[1];
        $match_type = (int)$this->data[2];

        return DomainBannedWords::create($content, $match_type);
    }

    /**
     * 对规则启用或禁用
     * @return string
     */
    private function status(): string
    {
        /**
         * 验证格式
         */
        if (count($this->data) != 3) {
            return '格式不正确，数组不等于3';
        }
        $data = array_filter($this->data, function ($v, $k) {
            return $v !== '';
        }, ARRAY_FILTER_USE_BOTH);
        if (count($data) !== count($this->data)) {
            return '格式不正确，数组值不能为空';
        }

        // 1. 主键
        if (!is_numeric($this->data[1])) {
            return '主键非数字：' . $this->data[1];
        }
        $id = (int)$this->data[1];

        // 2. 状态
        if (!is_numeric($this->data[2])) {
            return '状态非数字：' . $this->data[2];
        }
        $status = (int)$this->data[2];
        if (!in_array($status, [0, 1])) {
            return '状态：1开,0关' . PHP_EOL . '不正确的：' . $status;
        }

        /**
         * 是否存在主键
         */
        $obj = BannedWordsModel::where('id', $id)->findOrEmpty();
        if ($obj->isEmpty()) {
            return '不存在的主键：' . $id;
        }

        /**
         * 更新
         */
        $obj->status = $status;
        $obj->save();

        return ($status ? '启用规则ID:' : '禁用规则ID:') . $id;
    }

    /**
     * 编辑
     * @return string
     */
    private function update(): string
    {
        /**
         * 验证格式
         */
        if (count($this->data) != 4) {
            return '格式不正确，数组不等于4';
        }
        $data = array_filter($this->data, function ($v, $k) {
            return $v !== '';
        }, ARRAY_FILTER_USE_BOTH);
        if (count($data) !== count($this->data)) {
            return '格式不正确，数组值不能为空';
        }

        // 1. 主键
        if (!is_numeric($this->data[1])) {
            return '主键非数字：' . $this->data[1];
        }
        $id = (int)$this->data[1];
        // 2. 匹配内容
        $content = $this->data[2];
        // 3. 匹配模式
        if (!is_numeric($this->data[3])) {
            return '匹配模式非数字：' . $this->data[3];
        }
        $match_type = (int)$this->data[3];

        return DomainBannedWords::update($id, $content, $match_type);
    }

    /**
     * 显示规则
     * @return string
     */
    private function show(): string
    {
        /**
         * 验证格式
         */
        if (count($this->data) != 2) {
            return '格式不正确，数组不等于2';
        }

        // 1. 主键
        if (!is_numeric($this->data[1])) {
            return '主键非数字：' . $this->data[1];
        }
        $id = (int)$this->data[1];

        /**
         * 是否存在主键
         */
        $obj = BannedWordsModel::where('id', $id)->findOrEmpty();
        if ($obj->isEmpty()) {
            return '不存在的主键：' . $id;
        }

        return json_encode($obj->toArray(), JSON_UNESCAPED_UNICODE);
    }
}
